#include "resolver.h"

Resolver::Resolver() {
	costoSolucion = 0;
}

Resolver::~Resolver() {

}

void Resolver::getInput() {
	
	cin >> cantFabricas;
	cin >> cantClientes;
	cin >> cantRutas;

	int inicio, fin, longitud;

	for(int i = 0; i < cantRutas; i++) {
		cin >> inicio;
		cin >> fin;
		cin >> longitud;

		rutas.push_back(Ruta(--inicio, --fin, longitud));
	}
}

void Resolver::buscarSolucion() {
	/* ordenar las aristas por costo */
	sort(rutas.begin(), rutas.end(), compararRutas);

	/* Tomar las aristas más baratas y crear disjoint set */
	DisjointSet ds(cantFabricas, cantClientes);

	for(vector<Ruta>::const_iterator it = rutas.begin(); it != rutas.end(); it++) {
		if(ds.unir(ds.padre(it->ciudad_inicio), ds.padre(it->ciudad_fin))) {
			solucion.push_back(*it);
			costoSolucion += it->longitud;
		}
	}
}

bool Resolver::compararRutas(Ruta r1, Ruta r2) {
	/* devuelve verdadero si r1 es de menor costo que r2 */
	return (r1.longitud < r2.longitud);
}

ostream& operator<<(ostream &os, const Resolver &r) {
	os << r.costoSolucion << " ";
	os << r.solucion.size() << " ";

	for(list<Ruta>::const_iterator it = r.solucion.begin(); it != r.solucion.end(); it++)
		os << it->ciudad_inicio+1 << " " << it->ciudad_fin+1 << " ";

	os << endl;

	return os;
}
